package fiuba.algo3.algoThieft.modelo;
import java.lang.Math;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.w3c.dom.Element;
import org.w3c.dom.Node;



public class Capital {
    private static final int INDICE_BIBLIOTECA=0, INDICE_LUGAR_DE_VIAJES=1,INDICE_LUGAR_ECONOMICO=2;
    
    //La escala es en kilometros
    private int coordenadaX;
    private int coordenadaY;
    
    private String nombre;
    private String pais;
    private String descripcion;
    private ArrayList<Lugar> lugares;
    private ArrayList<Capital> capitalesAdyacentes;
    
    public Capital (int coordenadaX, int coordenadaY){
        this.coordenadaX = coordenadaX;
        this.coordenadaY = coordenadaY;
    }
      
    public void setCapitalesAdyacentes(Capital capitalAdyacente1, 
    		Capital capitalAdyacente2, Capital capitalAdyacente3) {
        this.capitalesAdyacentes.add(capitalAdyacente1);
        this.capitalesAdyacentes.add(capitalAdyacente2);
        this.capitalesAdyacentes.add(capitalAdyacente3);
            
    }

    public List<Capital> getCapitalesAdyacentes() {
        return this.capitalesAdyacentes;
    }

    public int getCoordenadaX (){
        return this.coordenadaX;
    }
    
    public int getCoordenadaY (){
        return this.coordenadaY;
    }

    public int distancia(Capital destino) {
        int x1 = this.getCoordenadaX() - destino.getCoordenadaX();
        int y1 = this.getCoordenadaY() - destino.getCoordenadaY();
        
        int distancia = (int) Math.hypot(x1,y1);
            
        return distancia;
    }

    public String getNombre() {
        return this.nombre;
    }

    public String getPais (){
        return this.pais;
    }
    
    public String getDescripcion (){
        return this.descripcion;
    }
    
    public List<Lugar> getLugares() {
        return Arrays.asList(this.getBiblioteca(),this.getLugarDeViajes(),this.getLugarEconomico());
    }

	public Lugar getBiblioteca() {
		return lugares.get(INDICE_BIBLIOTECA);
	}
	public Lugar getLugarDeViajes (){
		return lugares.get(INDICE_LUGAR_DE_VIAJES);
	}
	public Lugar getLugarEconomico (){
		return lugares.get(INDICE_LUGAR_ECONOMICO);
	}

	public static Capital crearCapital(Node nodo) {

		int coorX = Integer.parseInt( ( ( Element ) nodo).getAttribute("coordenadaX") );
		int coorY = Integer.parseInt( ( ( Element ) nodo).getAttribute("coordenadaY") );
		Capital capital = new Capital( coorX , coorY );
		capital.capitalesAdyacentes = new ArrayList<Capital>();
		capital.nombre = ( ( Element ) nodo ).getAttribute("nombre");
		capital.pais = ( ( Element ) nodo ).getAttribute("pais");
		capital.descripcion = ( ( Element ) nodo ).getAttribute("descripcion");
		
		
		capital.lugares = new ArrayList<Lugar>();
		for ( int i=0 ; i < ((Element)nodo).getChildNodes().getLength() ; i++ ){
			capital.lugares.add( Lugar.crearLugar ( ((Element)nodo).getChildNodes().item( i ) ) );
		
		}
		return capital;
	}
	
	public void esconder(Ladron ladron) {
		List<Lugar> lugares = this.getLugares();
		int indiceLadron = (int) (Math.random()* 2) ;
		
		lugares.get(indiceLadron).esconder(ladron);
		
		List<Proyectil> proyectiles = new ArrayList <Proyectil>(Arrays.asList(new Cuchillo(),new Bala()));
		for (int i=0; i < lugares.size(); i++){
			Lugar lugar = lugares.get(i);
			if (! lugar.hayAlguienEscondido()){
				int indiceProyectil = (int) (Math.random()* (proyectiles.size()-1));
				Proyectil proyectil = proyectiles.remove(indiceProyectil);
				lugar.esconder(new Secuaz(proyectil));
			}
		}	
	}

	public void guardarCaracteristicas(List<Caracteristica> caracteristicas) {
		for (Lugar lugar : this.getLugares()){
			lugar.guardarCaracteristica(this.obtenerCaracteristicaAleatoria(caracteristicas));
		}
	}

	private Caracteristica obtenerCaracteristicaAleatoria (List<Caracteristica> caracteristicas){
		int indiceAleatorio = (int) (Math.random() * caracteristicas.size()-1);
		return caracteristicas.get(indiceAleatorio);
	}
	
	public void ladronViajaA(Capital otraCapital) {
		this.getBiblioteca().guardarPistasDe(otraCapital.getBiblioteca());
		this.getLugarDeViajes().guardarPistasDe(otraCapital.getLugarDeViajes());
		this.getLugarEconomico().guardarPistasDe(otraCapital.getLugarEconomico());
	}

	public void desconocerLadron() {
		for (Lugar lugar : this.getLugares()){
			lugar.desconocerLadron();
		}
	}
}
